#include <jni.h>
#include <string>
#include <android/log.h>

#define TAG    "jni-test" // 这个是自定义的LOG的标识
#define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG ,TAG,__VA_ARGS__) // 定义LOGD类型

extern "C" JNIEXPORT jstring JNICALL
Java_com_cloudminds_nativeapplication_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}


jobject jCallback;
jmethodID onBufJavaCallbackId;

extern "C"
JNIEXPORT jint JNICALL
Java_com_cloudminds_nativeapplication_jni_NativeProcessJni_native_1process_1init(JNIEnv *env,
                                                                                 jclass clazz,jobject native_callback) {
    // TODO: implement native_process_init()
    LOGD("jni native_process_init");
    jCallback = env->NewGlobalRef(native_callback);
    jclass jcbClass = env->GetObjectClass(jCallback);
    if (!jcbClass) {
        LOGD("Unable to find call back class");
        return -1;
    }
    //获取要回调的方法ID
    onBufJavaCallbackId = env->GetMethodID(jcbClass, "onBuffer", "([B)V");
    return 0;
}

extern "C" JNIEXPORT jint JNICALL
Java_com_cloudminds_nativeapplication_jni_NativeProcessJni_native_1process_1feed(JNIEnv *env,
                                                                                 jclass clazz,
                                                                                 jbyteArray data,
                                                                                 jint len) {
    // TODO: implement native_process_feed()
    LOGD("jni native_process_feed");
    //1. 获取数组指针和长度
    // 将本地的数组指针直接指向Java端的数组地址
    jbyte *c_array = env->GetByteArrayElements(data, 0);
    int len_arr = env->GetArrayLength(data);

    //2. 具体处理
    // 不是返回值要手动释放，但是返回值就不需要手动释放！
    // jbyteArray c_result = env->NewByteArray(len_arr);
    jbyte buf[len_arr];
    for(int i=0; i<len_arr; i++){
        buf[i] = c_array[i] + 1;
    }
    //本地的数组数据拷贝到堆上分配的数组中去, 这里直接使用java层传递的数组也可以
    env->SetByteArrayRegion(data, 0, len_arr, buf);
    env->CallVoidMethod(jCallback, onBufJavaCallbackId, data);

    //3. 释放指针, GetByteArrayElements 和 ReleaseByteArrayElements 要成对使用
    env->ReleaseByteArrayElements(data, c_array, 0);
    return 0;
}


